Case study on Moneyball
Bill James was the originator of the sabermetrics, the approach of using data to predict what outcomes best predicted if a team would win.
The goal of baseball game is to score more runs, than the other team.
Each team has 9 batters who have an opportunity to hit a ball with a bat in a predetermined order.
Each time a batter has an opportunity to bat, we call it a plate appearance (PA).
The PA ends with a binary outcome: the batter either makes an out (failure) and returns to the bench or the batter doesn’t (success) and can run around the bases, and potentially score a run (reach all 4 bases).
There are five ways a batter can succeed (not make an out):
Bases on balls (BB): the pitcher fails to throw the ball through a predefined area considered to be hittable (the strike zone), so the batter is permitted to go to first base.
Single: the batter hits the ball and gets to first base.
Double (2B): the batter hits the ball and gets to second base.
Triple (3B): the batter hits the ball and gets to third base.
Home Run (HR): the batter hits the ball and goes all the way home and scores a run.
- Historically, the batting average has been considered the most important offensive statistic. To define this average, we define a hit (H) and an at bat (AB). Singles, doubles, triples and home runs are hits. The fifth way to be successful, a walk (BB), is not a hit. An AB is the number of times you either get a hit or make an out; BBs are excluded. The batting average is simply H/AB and is considered the main measure of a success rate.
The visualization of choice when exploring the relationship between two variables like home runs and runs is a scatterplot.

What is the aplication of statistics and data science to baseball called?
Sabermetrics
What is the outcome is not included in the batting average?
A base on balls
Why do we consider team statistics as well as individual player statistcs?
Team statistics are important because the success of individual players depends also on the strength of their team.
You want to know whether teams with more at-bats per game have more runs per game.

Load the Lahman library. Filter the Teams data frame to include years from 1961 to 2001. Make a scatterplot of runs per game versus at bats (AB) per game.
Use the filtered Teams data frame from Question 6. Make a scatterplot of win rate (number of wins per game) versus number of fielding errors (E) per game.
Which of the following is true?
When you examine the scatterplot above, you can see a clear trend towards decreased win rate with increasing number of errors per game.
Use the filtered Teams data frame from Question 6. Make a scatterplot of triples (X3B) per game versus doubles (X2B) per game.
Correlation - Case Study: is height hereditary?
Galton tried to predict sons’ heights based on fathers’ heights.
The mean and standard errors are insufficient for describing an important characteristic of the data: the trend that the taller the father, the taller the son.
The correlation coefficient is an informative summary of how two variables move together that can be used to predict one variable using the other.

father son
father 1.0000 0.4334
son 0.4334 1.0000
[1] 0.4334

The correlation that we compute and use as a summary is a random variable.
When interpreting correlations, it is important to remember that correlations derived from samples are estimates containing uncertainty.
Because the sample correlation is an average of independent draws, the central limit theorem applies.

[1] 0.4292
[1] 0.1664

*Questions:
- 1.While studying heredity, Francis Galton developed what important statistical concept?
Francis Galton developed the concept of correlation while study heredity.
- 2.The correlation coefficient is a summary of what?
The correlation coefficient is a summary of the trend between two variables.
The standard deviation describes the dispersion of a variable; the mean is a description of a variable’s central tendency; the distribution of a variable (e.g., normal, log-normal) describes the possible values of your data and the probability of them occurring.
- Instead of running a Monte Carlo simulation with a sample size of 25 from the 179 father-son pairs described in the videos, we now run our simulation with a sample size of 50. Would you expect the expected value of our sample correlation to increase, decrease, or stay approximately the same?
Explanation Because the expected value of the sample correlation is the population correlation, it should stay approximately the same even if the sample size is increased.
- Instead of running a Monte Carlo simulation with a sample size of 25 from the 179 father-son pairs described in the videos, we now run our simulation with a sample size of 50. Would you expect the standard error of our sample correlation to increase, decrease, or stay approximately the same?
Explanation
As the sample size N increases, the standard deviation of the sample correlation should decrease.
- If X and Y are completely independent, what do you expect the value of the correlation coefficient to be?
Explanation
Variables that are independent of each other have a correlation coefficient of 0.
- Load the Lahman library. Filter the Teams data frame to include years from 1961 to 2001. What is the correlation coefficient between number of runs per game and number of at bats per game?
[1] 0.6581
The solution for this correlation is cor(runs per game, at bats per game) = 0.6581
- Use the same filtered dataset from previous question. What is the correlation coeffcient between win rate (number of win per game and number of errors per game)? solution:
answer : correlation = -0.3397
- What is the correlation coefficient between doubles(X2B) per game and triples (X3B) per game?
[1] -0.01157
answer: correlation = -0.0116
LS0tDQp0aXRsZTogIlJlZ3Jlc3Npb24gTGVjdHVyZXMiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kb3B0aW9ucyhkaWdpdHMgPSA0KQ0KbGlicmFyeShMYWhtYW4pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dFeHRyYSkNCmxpYnJhcnkoZHNsYWJzKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KZHNfdGhlbWVfc2V0KCkNCmBgYA0KDQojIyMgQ2FzZSBzdHVkeSBvbiBNb25leWJhbGwNCg0KKiBCaWxsIEphbWVzIHdhcyB0aGUgb3JpZ2luYXRvciBvZiB0aGUgKipzYWJlcm1ldHJpY3MqKiwgdGhlIGFwcHJvYWNoIG9mIHVzaW5nIGRhdGEgdG8gcHJlZGljdCB3aGF0IG91dGNvbWVzIGJlc3QgcHJlZGljdGVkIGlmIGEgdGVhbSB3b3VsZCB3aW4uDQoNCiogVGhlIGdvYWwgb2YgYmFzZWJhbGwgZ2FtZSBpcyB0byBzY29yZSBtb3JlIHJ1bnMsIHRoYW4gdGhlIG90aGVyIHRlYW0uDQoNCiogRWFjaCB0ZWFtIGhhcyA5IGJhdHRlcnMgd2hvIGhhdmUgYW4gb3Bwb3J0dW5pdHkgdG8gaGl0IGEgYmFsbCB3aXRoIGEgYmF0IGluIGEgcHJlZGV0ZXJtaW5lZCBvcmRlci4NCg0KKiBFYWNoIHRpbWUgYSBiYXR0ZXIgaGFzIGFuIG9wcG9ydHVuaXR5IHRvIGJhdCwgd2UgY2FsbCBpdCBhIHBsYXRlIGFwcGVhcmFuY2UgKFBBKS4NCg0KKiBUaGUgUEEgZW5kcyB3aXRoIGEgYmluYXJ5IG91dGNvbWU6IHRoZSBiYXR0ZXIgZWl0aGVyIG1ha2VzIGFuIG91dCAoZmFpbHVyZSkgYW5kIHJldHVybnMgdG8gdGhlIGJlbmNoIG9yIHRoZSBiYXR0ZXIgZG9lc27igJl0IChzdWNjZXNzKSBhbmQgY2FuIHJ1biBhcm91bmQgdGhlIGJhc2VzLCBhbmQgcG90ZW50aWFsbHkgc2NvcmUgYSBydW4gKHJlYWNoIGFsbCA0IGJhc2VzKS4NCg0KKiBUaGVyZSBhcmUgZml2ZSB3YXlzIGEgYmF0dGVyIGNhbiBzdWNjZWVkIChub3QgbWFrZSBhbiBvdXQpOg0KDQoxLiBCYXNlcyBvbiBiYWxscyAoQkIpOiB0aGUgcGl0Y2hlciBmYWlscyB0byB0aHJvdyB0aGUgYmFsbCB0aHJvdWdoIGEgcHJlZGVmaW5lZCBhcmVhIGNvbnNpZGVyZWQgdG8gYmUgaGl0dGFibGUgKHRoZSBzdHJpa2Ugem9uZSksIHNvIHRoZSBiYXR0ZXIgaXMgcGVybWl0dGVkIHRvIGdvIHRvIGZpcnN0IGJhc2UuDQoNCjIuIFNpbmdsZTogdGhlIGJhdHRlciBoaXRzIHRoZSBiYWxsIGFuZCBnZXRzIHRvIGZpcnN0IGJhc2UuDQoNCjMuIERvdWJsZSAoMkIpOiB0aGUgYmF0dGVyIGhpdHMgdGhlIGJhbGwgYW5kIGdldHMgdG8gc2Vjb25kIGJhc2UuDQoNCjQuIFRyaXBsZSAoM0IpOiB0aGUgYmF0dGVyIGhpdHMgdGhlIGJhbGwgYW5kIGdldHMgdG8gdGhpcmQgYmFzZS4NCg0KNS4gSG9tZSBSdW4gKEhSKTogdGhlIGJhdHRlciBoaXRzIHRoZSBiYWxsIGFuZCBnb2VzIGFsbCB0aGUgd2F5IGhvbWUgYW5kIHNjb3JlcyBhIHJ1bi4NCg0KKiBIaXN0b3JpY2FsbHksIHRoZSBiYXR0aW5nIGF2ZXJhZ2UgaGFzIGJlZW4gY29uc2lkZXJlZCB0aGUgbW9zdCBpbXBvcnRhbnQgb2ZmZW5zaXZlIHN0YXRpc3RpYy4gVG8gZGVmaW5lIHRoaXMgYXZlcmFnZSwgd2UgZGVmaW5lIGEgaGl0IChIKSBhbmQgYW4gYXQgYmF0IChBQikuIFNpbmdsZXMsIGRvdWJsZXMsIHRyaXBsZXMgYW5kIGhvbWUgcnVucyBhcmUgaGl0cy4gVGhlIGZpZnRoIHdheSB0byBiZSBzdWNjZXNzZnVsLCBhIHdhbGsgKEJCKSwgaXMgbm90IGEgaGl0LiBBbiBBQiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHlvdSBlaXRoZXIgZ2V0IGEgaGl0IG9yIG1ha2UgYW4gb3V0OyBCQnMgYXJlIGV4Y2x1ZGVkLiAqKlRoZSBiYXR0aW5nIGF2ZXJhZ2UgaXMgc2ltcGx5IEgvQUIgYW5kIGlzIGNvbnNpZGVyZWQgdGhlIG1haW4gbWVhc3VyZSBvZiBhIHN1Y2Nlc3MgcmF0ZS4qKg0KDQpUaGUgdmlzdWFsaXphdGlvbiBvZiBjaG9pY2Ugd2hlbiBleHBsb3JpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB2YXJpYWJsZXMgbGlrZSBob21lIHJ1bnMgYW5kIHJ1bnMgaXMgYSAqKnNjYXR0ZXJwbG90KiouDQoNCmBgYHtyIHBsb3RzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCg0KDQoNClRlYW1zICU+JSBmaWx0ZXIoeWVhcklEICVpbiUgMTk2MToyMDAxKSAlPiUNCiAgICBtdXRhdGUoSFJfcGVyX2dhbWUgPSBIUiAvIEcsIFJfcGVyX2dhbWUgPSBSIC8gRykgJT4lDQogICAgZ2dwbG90KGFlcyhIUl9wZXJfZ2FtZSwgUl9wZXJfZ2FtZSkpICsgDQogICAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkNCmBgYA0KDQpgYGB7ciBwbG90czIsIGluY2x1ZGU9RkFMU0V9DQoNCiNTY2F0dGVycGxvdCBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc3RvbGVuIGJhc2VzIGFuZCB3aW5zDQpUZWFtcyAlPiUgZmlsdGVyKHllYXJJRCAlaW4lIDE5NjE6MjAwMSkgJT4lDQogICAgbXV0YXRlKFNCX3Blcl9nYW1lID0gU0IgLyBHLCBSX3Blcl9nYW1lID0gUiAvIEcpICU+JQ0KICAgIGdncGxvdChhZXMoU0JfcGVyX2dhbWUsIFJfcGVyX2dhbWUpKSArIA0KICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpDQpgYGANCg0KYGBge3IgcGxvdHMzLCBpbmNsdWRlPUZBTFNFfQ0KDQojU2NhdHRlcnBsb3Qgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJhc2VzIG9uIGJhbGxzIGFuZCBydW5zDQpUZWFtcyAlPiUgZmlsdGVyKHllYXJJRCAlaW4lIDE5NjE6MjAwMSkgJT4lDQogICAgbXV0YXRlKEJCX3Blcl9nYW1lID0gQkIgLyBHLCBSX3Blcl9nYW1lID0gUiAvIEcpICU+JQ0KICAgIGdncGxvdChhZXMoQkJfcGVyX2dhbWUsIFJfcGVyX2dhbWUpKSArIA0KICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpDQpgYGANCg0KKiBRdWVzdGlvbjENCg0KV2hhdCBpcyB0aGUgYXBsaWNhdGlvbiBvZiBzdGF0aXN0aWNzIGFuZCBkYXRhIHNjaWVuY2UgdG8gYmFzZWJhbGwgY2FsbGVkPw0KDQoqU2FiZXJtZXRyaWNzKg0KDQoqIFF1ZXN0aW9uMg0KDQpXaGF0IGlzIHRoZSBvdXRjb21lIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYmF0dGluZyBhdmVyYWdlPw0KDQoqQSBiYXNlIG9uIGJhbGxzKg0KDQoqIFF1ZXN0aW9uMw0KDQpXaHkgZG8gd2UgY29uc2lkZXIgdGVhbSBzdGF0aXN0aWNzIGFzIHdlbGwgYXMgaW5kaXZpZHVhbCBwbGF5ZXIgc3RhdGlzdGNzPw0KDQpUZWFtIHN0YXRpc3RpY3MgYXJlIGltcG9ydGFudCBiZWNhdXNlIHRoZSBzdWNjZXNzIG9mIGluZGl2aWR1YWwgcGxheWVycyBkZXBlbmRzIGFsc28gb24gdGhlIHN0cmVuZ3RoIG9mIHRoZWlyIHRlYW0uDQoNCiogUXVlc3Rpb240DQoNCllvdSB3YW50IHRvIGtub3cgd2hldGhlciB0ZWFtcyB3aXRoIG1vcmUgYXQtYmF0cyBwZXIgZ2FtZSBoYXZlIG1vcmUgcnVucyBwZXIgZ2FtZS4NCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KDQpwIDwtIFRlYW1zICU+JSBmaWx0ZXIoeWVhcklEICVpbiUgMTk2MToyMDAxICkgJT4lDQogICAgbXV0YXRlKEFCX3Blcl9nYW1lID0gQUIvRywgUl9wZXJfZ2FtZSA9IFIvRykgJT4lDQogICAgZ2dwbG90KGFlcyhBQl9wZXJfZ2FtZSwgUl9wZXJfZ2FtZSkpICsgDQogICAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKw0KICAgIGxhYnMoeCA9ICdhdC1iYXRzIHBlciBnYW1lJywgeSA9ICdSdW5zIHBlciBnYW1lJywgdGl0bGUgPSAnUmVsYXRpb25zaGlwIChhdC1iYXRzIHggcnVucykgcGVyIGdhbWUnICkNCg0KDQpwMSA8LSBnZ01hcmdpbmFsKHAsIHR5cGUgPSAiaGlzdG9ncmFtIiwgY29sb3IgPSAnYmxhY2snLCBmaWxsID0gJ3B1cnBsZScpDQoNCnAxDQpgYGANCg0KKiBRdWVzdGlvbjYNCg0KTG9hZCB0aGUgTGFobWFuIGxpYnJhcnkuIEZpbHRlciB0aGUgVGVhbXMgZGF0YSBmcmFtZSB0byBpbmNsdWRlIHllYXJzIGZyb20gMTk2MSB0byAyMDAxLiBNYWtlIGEgc2NhdHRlcnBsb3Qgb2YgcnVucyBwZXIgZ2FtZSB2ZXJzdXMgYXQgYmF0cyAoQUIpIHBlciBnYW1lLg0KDQpgYGB7ciBwbG90NSwgZWNobz1GQUxTRX0NCg0KcCA8LSBUZWFtcyAlPiUgDQogICAgIGZpbHRlcih5ZWFySUQgJWluJSAxOTYxOjIwMDEpICU+JQ0KICAgICBtdXRhdGUocnVuc19wZXJfZ2FtZSA9IFIvRywgQUJfcGVyX2dhbWUgPSBBQi9HKSAlPiUNCiAgICAgZ2dwbG90KGFlcyhydW5zX3Blcl9nYW1lLCBBQl9wZXJfZ2FtZSkpICsNCiAgICAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKw0KICAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgY29sb3IgPSAicmVkIiwgc2UgPSBGQUxTRSkNCmdncGxvdGx5KHApDQpgYGANCg0KKiBRdWVzdGlvbjcNCg0KVXNlIHRoZSBmaWx0ZXJlZCBUZWFtcyBkYXRhIGZyYW1lIGZyb20gUXVlc3Rpb24gNi4gTWFrZSBhIHNjYXR0ZXJwbG90IG9mIHdpbiByYXRlIChudW1iZXIgb2Ygd2lucyBwZXIgZ2FtZSkgdmVyc3VzIG51bWJlciBvZiBmaWVsZGluZyBlcnJvcnMgKEUpIHBlciBnYW1lLg0KDQoNCldoaWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZT8NCg0KYGBge3IgcTcsIGVjaG89RkFMU0V9DQoNCnAgPC0gVGVhbXMgJT4lIA0KICAgICBmaWx0ZXIoeWVhcklEICVpbiUgMTk2MToyMDAxKSAlPiUNCiAgICAgbXV0YXRlKHdpbl9yYXRlID0gVy9HLCBFX3JhdGUgPSBFL0cpICU+JQ0KICAgICBnZ3Bsb3QoYWVzKHdpbl9yYXRlLCBFX3JhdGUpKSArDQogICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsNCiAgICAgbGFicyh4ID0gJ1dpbnMgcGVyIGdhbWUnLCB5ID0gJ0ZpZWxkaW5nIGVycm9ycyBwZXIgZ2FtZScpICsNCiAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGNvbG9yID0gInJlZCIsIHNlID0gRkFMU0UpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCldoZW4geW91IGV4YW1pbmUgdGhlIHNjYXR0ZXJwbG90IGFib3ZlLCB5b3UgY2FuIHNlZSBhIGNsZWFyIHRyZW5kIHRvd2FyZHMgZGVjcmVhc2VkIHdpbiByYXRlIHdpdGggaW5jcmVhc2luZyBudW1iZXIgb2YgZXJyb3JzIHBlciBnYW1lLg0KDQoqIFF1ZXN0aW9uOA0KDQpVc2UgdGhlIGZpbHRlcmVkIFRlYW1zIGRhdGEgZnJhbWUgZnJvbSBRdWVzdGlvbiA2LiBNYWtlIGEgc2NhdHRlcnBsb3Qgb2YgdHJpcGxlcyAoWDNCKSBwZXIgZ2FtZSB2ZXJzdXMgZG91YmxlcyAoWDJCKSBwZXIgZ2FtZS4NCg0KYGBge3IgcTgsIGVjaG89RkFMU0V9DQoNCnAgPC0gVGVhbXMgJT4lIA0KICAgICBmaWx0ZXIoeWVhcklEICVpbiUgMTk2MToyMDAxKSAlPiUNCiAgICAgbXV0YXRlKHRyaXBsZXNfcGVyX2dhbWUgPSBYM0IvRywgZG91Ymxlc19wZXJfZ2FtZSA9IFgyQi9HKSAlPiUNCiAgICAgZ2dwbG90KGFlcyh0cmlwbGVzX3Blcl9nYW1lLCBkb3VibGVzX3Blcl9nYW1lKSkgKw0KICAgICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArDQogICAgIGxhYnMoeCA9ICdUcmlwbGVzIHBlciBnYW1lJywgeSA9ICdEb3VibGVzIHBlciBnYW1lJykgKw0KICAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgY29sb3IgPSAicmVkIiwgc2UgPSBGQUxTRSkNCmdncGxvdGx5KHApDQpgYGANCg0KIyMjIENvcnJlbGF0aW9uIC0gQ2FzZSBTdHVkeTogaXMgaGVpZ2h0IGhlcmVkaXRhcnk/DQoNCg0KDQoqIEdhbHRvbiB0cmllZCB0byBwcmVkaWN0IHNvbnMnIGhlaWdodHMgYmFzZWQgb24gZmF0aGVycycgaGVpZ2h0cy4NCg0KKiBUaGUgbWVhbiBhbmQgc3RhbmRhcmQgZXJyb3JzIGFyZSBpbnN1ZmZpY2llbnQgZm9yIGRlc2NyaWJpbmcgYW4gaW1wb3J0YW50IGNoYXJhY3RlcmlzdGljIG9mIHRoZSBkYXRhOiB0aGUgdHJlbmQgdGhhdCB0aGUgdGFsbGVyIHRoZSBmYXRoZXIsIHRoZSB0YWxsZXIgdGhlIHNvbi4NCg0KKiBUaGUgKipjb3JyZWxhdGlvbiBjb2VmZmljaWVudCoqIGlzIGFuIGluZm9ybWF0aXZlIHN1bW1hcnkgb2YgaG93IHR3byB2YXJpYWJsZXMgbW92ZSB0b2dldGhlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHByZWRpY3Qgb25lIHZhcmlhYmxlIHVzaW5nIHRoZSBvdGhlci4NCg0KYGBge3IgR2FsdG9uLWRhdGEsIGVjaG89RkFMU0V9DQoNCmxpYnJhcnkoSGlzdERhdGEpDQpkYXRhKCJHYWx0b25GYW1pbGllcyIpDQpzZXQuc2VlZCgxOTgzKQ0KDQojZ2xpbXBzZShHYWx0b25GYW1pbGllcykNCg0KZ2FsdG9uX2hlaWdodHMgPC0gR2FsdG9uRmFtaWxpZXMgJT4lDQogIGZpbHRlcihnZW5kZXIgPT0gIm1hbGUiKSAlPiUNCiAgZ3JvdXBfYnkoZmFtaWx5KSAlPiUNCiAgc2FtcGxlX24oMSkgJT4lICAjIHNlbGVjaW9uYSBuIGFtb3N0cmFzIHBvciBsaW5oYSBkZSB1bWEgdGFiZWxhDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KGZhdGhlciwgY2hpbGRIZWlnaHQpICU+JQ0KICByZW5hbWUoc29uID0gY2hpbGRIZWlnaHQpDQojIGhlYWQoZ2FsdG9uX2hlaWdodHMpDQoNCiMgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMNCmdhbHRvbl9oZWlnaHRzICU+JQ0KICAgIHN1bW1hcml6ZShtZWFuKGZhdGhlciksIHNkKGZhdGhlciksIG1lYW4oc29uKSwgc2Qoc29uKSkNCmBgYA0KDQpgYGB7ciBwbG90LUdhbHRvbi1maWx0ZXJlZC1kYXRhLCBlY2hvPUZBTFNFfQ0KDQojIHNjYXR0ZXJwbG90IG9mIGZhdGhlciBhbmQgc29uIGhlaWdodHMNCmdhbHRvbl9oZWlnaHRzICU+JQ0KICAgIGdncGxvdChhZXMoZmF0aGVyLCBzb24pKSArDQogICAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkNCmBgYA0KDQpgYGB7ciBtYXRyaXgtY29ycmVsYXRpb24sIGVjaG89RkFMU0V9DQoNCm1jb3IgPC0gY29yKGdhbHRvbl9oZWlnaHRzKQ0KbWNvcg0KDQoNCmdhbHRvbl9oZWlnaHRzICU+JSBzdW1tYXJpemUociA9IGNvcihmYXRoZXIsIHNvbikpICU+JSBwdWxsKHIpDQpjb3JycGxvdChtY29yKQ0KYGBgDQoNCiogVGhlIGNvcnJlbGF0aW9uIHRoYXQgd2UgY29tcHV0ZSBhbmQgdXNlIGFzIGEgc3VtbWFyeSBpcyBhIHJhbmRvbSB2YXJpYWJsZS4NCg0KKiBXaGVuIGludGVycHJldGluZyBjb3JyZWxhdGlvbnMsIGl0IGlzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IGNvcnJlbGF0aW9ucyBkZXJpdmVkIGZyb20gc2FtcGxlcyBhcmUgZXN0aW1hdGVzIGNvbnRhaW5pbmcgdW5jZXJ0YWludHkuDQoNCiogQmVjYXVzZSB0aGUgc2FtcGxlIGNvcnJlbGF0aW9uIGlzIGFuIGF2ZXJhZ2Ugb2YgaW5kZXBlbmRlbnQgZHJhd3MsIHRoZSBjZW50cmFsIGxpbWl0IHRoZW9yZW0gYXBwbGllcy4gDQoNCmBgYHtyIHNhbXBsZS1jb3JyZWxhdGlvbiwgZWNobz1GQUxTRX0NCg0KIyBjb21wdXRlIHNhbXBsZSBjb3JyZWxhdGlvbg0KUiA8LSBzYW1wbGVfbihnYWx0b25faGVpZ2h0cywgMjUsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgICBzdW1tYXJpemUociA9IGNvcihmYXRoZXIsIHNvbikpDQpSDQoNCiMgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiB0byBzaG93IGRpc3RyaWJ1dGlvbiBvZiBzYW1wbGUgY29ycmVsYXRpb24NCkIgPC0gMTAwMA0KTiA8LSAyNQ0KUiA8LSByZXBsaWNhdGUoQiwgew0KICAgIHNhbXBsZV9uKGdhbHRvbl9oZWlnaHRzLCBOLCByZXBsYWNlID0gVFJVRSkgJT4lDQogICAgc3VtbWFyaXplKHIgPSBjb3IoZmF0aGVyLCBzb24pKSAlPiUNCiAgICBwdWxsKHIpDQp9KQ0KcXBsb3QoUiwgZ2VvbSA9ICJoaXN0b2dyYW0iLCBiaW53aWR0aCA9IDAuMDUsIGNvbG9yID0gSSgiYmxhY2siKSkNCg0KIyBleHBlY3RlZCB2YWx1ZSBhbmQgc3RhbmRhcmQgZXJyb3INCm1lYW4oUikNCnNkKFIpDQojIFFRLXBsb3QgdG8gZXZhbHVhdGUgd2hldGhlciBOIGlzIGxhcmdlIGVub3VnaA0KZGF0YS5mcmFtZShSKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IFIpKSArDQogICAgc3RhdF9xcSgpICsNCiAgICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSBtZWFuKFIpLCBzbG9wZSA9IHNxcnQoKDEtbWVhbihSKV4yKS8oTi0yKSkpDQpgYGANCg0KKlF1ZXN0aW9uczoNCg0KKiAxLldoaWxlIHN0dWR5aW5nIGhlcmVkaXR5LCBGcmFuY2lzIEdhbHRvbiBkZXZlbG9wZWQgd2hhdCBpbXBvcnRhbnQgc3RhdGlzdGljYWwgY29uY2VwdD8NCg0KKkZyYW5jaXMgR2FsdG9uIGRldmVsb3BlZCB0aGUgY29uY2VwdCBvZiBjb3JyZWxhdGlvbiB3aGlsZSBzdHVkeSBoZXJlZGl0eS4qDQoNCiogMi5UaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgaXMgYSBzdW1tYXJ5IG9mIHdoYXQ/DQoNCipUaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgaXMgYSBzdW1tYXJ5IG9mIHRoZSB0cmVuZCBiZXR3ZWVuIHR3byB2YXJpYWJsZXMuKg0KDQoqVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBkZXNjcmliZXMgdGhlIGRpc3BlcnNpb24gb2YgYSB2YXJpYWJsZTsgdGhlIG1lYW4gaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHZhcmlhYmxl4oCZcyBjZW50cmFsIHRlbmRlbmN5OyB0aGUgZGlzdHJpYnV0aW9uIG9mIGEgdmFyaWFibGUgKGUuZy4sIG5vcm1hbCwgbG9nLW5vcm1hbCkgZGVzY3JpYmVzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgeW91ciBkYXRhIGFuZCB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlbSBvY2N1cnJpbmcuKg0KDQoqIDQuIEluc3RlYWQgb2YgcnVubmluZyBhIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gd2l0aCBhIHNhbXBsZSBzaXplIG9mIDI1IGZyb20gdGhlIDE3OSBmYXRoZXItc29uIHBhaXJzIGRlc2NyaWJlZCBpbiB0aGUgdmlkZW9zLCB3ZSBub3cgcnVuIG91ciBzaW11bGF0aW9uIHdpdGggYSBzYW1wbGUgc2l6ZSBvZiA1MC4NCldvdWxkIHlvdSBleHBlY3QgdGhlICoqZXhwZWN0ZWQgdmFsdWUqKiBvZiBvdXIgc2FtcGxlIGNvcnJlbGF0aW9uIHRvIGluY3JlYXNlLCBkZWNyZWFzZSwgb3Igc3RheSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lPw0KDQpFeHBsYW5hdGlvbg0KKkJlY2F1c2UgdGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBzYW1wbGUgY29ycmVsYXRpb24gaXMgdGhlIHBvcHVsYXRpb24gY29ycmVsYXRpb24sIGl0IHNob3VsZCBzdGF5IGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZXZlbiBpZiB0aGUgc2FtcGxlIHNpemUgaXMgaW5jcmVhc2VkLioNCg0KKiA1LiBJbnN0ZWFkIG9mIHJ1bm5pbmcgYSBNb250ZSBDYXJsbyBzaW11bGF0aW9uIHdpdGggYSBzYW1wbGUgc2l6ZSBvZiAyNSBmcm9tIHRoZSAxNzkgZmF0aGVyLXNvbiBwYWlycyBkZXNjcmliZWQgaW4gdGhlIHZpZGVvcywgd2Ugbm93IHJ1biBvdXIgc2ltdWxhdGlvbiB3aXRoIGEgc2FtcGxlIHNpemUgb2YgNTAuDQpXb3VsZCB5b3UgZXhwZWN0IHRoZSAqKnN0YW5kYXJkIGVycm9yKiogb2Ygb3VyIHNhbXBsZSBjb3JyZWxhdGlvbiB0byBpbmNyZWFzZSwgZGVjcmVhc2UsIG9yIHN0YXkgYXBwcm94aW1hdGVseSB0aGUgc2FtZT8NCg0KRXhwbGFuYXRpb24NCg0KKkFzIHRoZSBzYW1wbGUgc2l6ZSBOIGluY3JlYXNlcywgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc2FtcGxlIGNvcnJlbGF0aW9uIHNob3VsZCBkZWNyZWFzZS4qDQoNCiogNi4gSWYgWCBhbmQgWSBhcmUgY29tcGxldGVseSBpbmRlcGVuZGVudCwgd2hhdCBkbyB5b3UgZXhwZWN0IHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgdG8gYmU/DQoNCkV4cGxhbmF0aW9uDQoNCipWYXJpYWJsZXMgdGhhdCBhcmUgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlciBoYXZlIGEgY29ycmVsYXRpb24gY29lZmZpY2llbnQgb2YgMC4qDQoNCiogNy4gTG9hZCB0aGUgTGFobWFuIGxpYnJhcnkuIEZpbHRlciB0aGUgVGVhbXMgZGF0YSBmcmFtZSB0byBpbmNsdWRlIHllYXJzIGZyb20gMTk2MSB0byAyMDAxLg0KV2hhdCBpcyB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgYmV0d2VlbiBudW1iZXIgb2YgcnVucyBwZXIgZ2FtZSBhbmQgbnVtYmVyIG9mIGF0IGJhdHMgcGVyIGdhbWU/DQoNCmBgYHtyIDdxLCBlY2hvPUZBTFNFfQ0KDQpjb3JyIDwtIFRlYW1zICU+JSBmaWx0ZXIoeWVhcklEICVpbiUgMTk2MToyMDAxICkgJT4lDQogICAgbXV0YXRlKEFCX3Blcl9nYW1lID0gQUIvRywgUl9wZXJfZ2FtZSA9IFIvRykgJT4lDQogICAgc3VtbWFyaXplKHIgPSBjb3IoQUJfcGVyX2dhbWUsIFJfcGVyX2dhbWUpKSAlPiUgDQogICAgcHVsbChyKQ0KY29ycg0KYGBgDQoNClRoZSBzb2x1dGlvbiBmb3IgdGhpcyBjb3JyZWxhdGlvbiBpcyBjb3IocnVucyBwZXIgZ2FtZSwgYXQgYmF0cyBwZXIgZ2FtZSkgPSBgciBjb3JyYA0KDQoqIDguIFVzZSB0aGUgc2FtZSBmaWx0ZXJlZCBkYXRhc2V0IGZyb20gcHJldmlvdXMgcXVlc3Rpb24uIA0KV2hhdCBpcyB0aGUgY29ycmVsYXRpb24gY29lZmZjaWVudCBiZXR3ZWVuIHdpbiByYXRlIChudW1iZXIgb2Ygd2luIHBlciBnYW1lIGFuZCBudW1iZXIgb2YgZXJyb3JzIHBlciBnYW1lKT8gDQpzb2x1dGlvbjoNCg0KYGBge3IgOHEsIGVjaG89RkFMU0V9DQoNCmNvcnIxIDwtIFRlYW1zICU+JSANCiAgICBmaWx0ZXIoeWVhcklEICVpbiUgMTk2MToyMDAxICkgJT4lDQogICAgbXV0YXRlKHdpbl9yYXRlID0gVy9HLCBFX3JhdGUgPSBFL0cpICU+JSANCiAgICBzdW1tYXJpemUociA9IGNvcih3aW5fcmF0ZSwgRV9yYXRlKSkgJT4lIA0KICAgIHB1bGwocikNCmNvcnIxDQpgYGANCmFuc3dlciA6ICoqY29ycmVsYXRpb24gPSBgciBjb3JyMWAgKioNCg0KKiA5LiBXaGF0IGlzIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBiZXR3ZWVuIGRvdWJsZXMoWDJCKSBwZXIgZ2FtZSBhbmQgdHJpcGxlcyAoWDNCKSBwZXIgZ2FtZT8NCg0KYGBge3IgOXEsIGVjaG89RkFMU0V9DQoNCmNvcnIyIDwtIFRlYW1zICU+JSANCiAgICAgZmlsdGVyKHllYXJJRCAlaW4lIDE5NjE6MjAwMSkgJT4lDQogICAgIG11dGF0ZSh0cmlwbGVzX3Blcl9nYW1lID0gWDNCL0csIGRvdWJsZXNfcGVyX2dhbWUgPSBYMkIvRykgJT4lICAgICAgc3VtbWFyaXplKHIgPSBjb3IodHJpcGxlc19wZXJfZ2FtZSwgZG91Ymxlc19wZXJfZ2FtZSkpICU+JSANCiAgICAgcHVsbChyKQ0KDQpjb3JyMg0KYGBgDQoNCmFuc3dlcjogKipjb3JyZWxhdGlvbiA9IGByIGNvcnIyYCAqKg0K